﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daBase.Objects.Safe
{
    /// <summary>
    /// Безопасный бездонный стек
    /// </summary>
    /// <typeparam name="TElement">Тип элементов стека</typeparam>
    public class SafeStack<TElement>
    {
        // Стек
        private Stack<TElement> stack;

        // Если стек пуст
        IfNoMoreMethod<TElement> ifnomore;

        /// <summary>
        /// Добавить элемент в стек
        /// </summary>
        /// <param name="Element">элемент</param>
        public void Push(TElement Element)
        {
            stack.Push(Element);
        }

        /// <summary>
        /// Вытолкнуть элемент из стека
        /// </summary>
        /// <returns>элемент</returns>
        public TElement Pop()
        {
            if (stack.Count == 0)
                return ifnomore();
            return stack.Pop();
        }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="IfNoMore">метод, создающий новый экземпляр TElement</param>
        public SafeStack(IfNoMoreMethod<TElement> IfNoMore)
        {
            stack = new Stack<TElement>();
            ifnomore = IfNoMore;
        }
    }
}
